package net.sh.dpinfrastructure.mongo;

import javax.persistence.Table;

import org.apache.commons.lang3.StringUtils;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;



/**
 * 
 * MongoDatabase 包装类
 * 
 * @version 1.0
 * @since JDK1.7
 * @author shaohui
 * @company 上海朝阳永续信息技术有限公司
 * @copyright (c) 2016 SunTime Co'Ltd Inc. All rights reserved.
 * @date 2016年4月14日 下午6:56:56
 */
public class DPMongoSource {
    
    private MongoClient client;
    
    private MongoDatabase database;
    
    /**
     * 连接状态
     */
    private boolean flag = false;
    
    /**
     * 
     * @param client
     * @param database
     */
    public DPMongoSource(MongoClient client, String database) {
        if (client == null) {
            throw new NullPointerException("client");
        }
        if (StringUtils.isEmpty(database)) {
            throw new IllegalArgumentException("database name is empty");
        }
        this.database = client.getDatabase(database);
        this.flag = true;
    }
    
    /**
     * 
     * 关闭所有mongo连接
     *
     * 
     * @author shaohui
     * @date 2016年4月14日 下午6:55:12
     */
    public void close() {
        client.close();
        this.flag = false;
    }
    
    /**
     * 
     * 根据实体类获得表
     * 
     * @param clazz
     * @return
     *
     * @author shaohui
     * @date 2016年7月3日下午5:02:48
     * @since JDK 1.8
     */
    public DPCollection getCollection(Class<?> clazz) {
        if (!this.flag) {
            throw new IllegalStateException("mongodb has closed");
        }
        String tableName = null;
        if (clazz.isAnnotationPresent(Table.class)) {
            Table table = clazz.getAnnotation(Table.class);
            tableName = table.name();
        }
        if (StringUtils.isBlank(tableName)) {
            tableName = clazz.getSimpleName();
        }
        return new DPCollection(database.getCollection(tableName));
    }
    
    /**
     * 
     * 获得表
     *
     * @param collectionName 表名
     * @return
     * 
     * @author shaohui
     * @date 2016年4月14日 下午6:58:38
     */
    public DPCollection getCollection(String collectionName) {
        if (!this.flag) {
            throw new IllegalStateException("mongodb has closed");
        }
        return new DPCollection(database.getCollection(collectionName));
    }
    
}
